// 声明包名，该类位于com.example.myapplication01.chapter08 包下 
package com.example.myapplication01.chapter08;

// 导入NonNull注解，用于标记参数或返回值不能为null 
import androidx.annotation.NonNull;
// 导入AppCompatActivity类，这是Android支持库中的一个基类，用于创建支持ActionBar的Activity 
import androidx.appcompat.app.AppCompatActivity;
// 导入FileProvider类，用于在Android 7.0及以上版本中安全地共享文件 
import androidx.core.content.FileProvider;

// 导入Manifest类，用于引用Android系统的权限常量 
import android.Manifest;
// 导入SuppressLint注解，用于抑制特定的代码检查警告 
import android.annotation.SuppressLint;
// 导入Intent类，用于在不同组件（如Activity、Service等）之间传递消息 
import android.content.Intent;
// 导入Cursor类，用于从数据库查询结果中获取数据 
import android.database.Cursor;
// 导入Bitmap类，用于处理位图图像 
import android.graphics.Bitmap;
// 导入BitmapFactory类，用于从不同来源（如文件、资源等）创建Bitmap对象 
import android.graphics.BitmapFactory;
// 导入MediaScannerConnection类，用于通知系统媒体扫描器扫描文件 
import android.media.MediaScannerConnection;
// 导入Uri类，用于表示统一资源标识符 
import android.net.Uri;
// 导入Build类，用于获取Android系统的版本信息 
import android.os.Build;
// 导入Bundle类，用于在Activity之间传递数据 
import android.os.Bundle;
// 导入Environment类，用于访问Android系统的环境变量和目录 
import android.os.Environment;
// 导入MediaStore类，用于访问Android系统的媒体数据库 
import android.provider.MediaStore;
// 导入Log类，用于在开发过程中输出日志信息 
import android.util.Log;
// 导入ViewGroup类，是所有布局容器的基类 
import android.view.ViewGroup;
// 导入EditText类，用于接收用户输入的文本框 
import android.widget.EditText;
// 导入GridLayout类，用于创建网格布局 
import android.widget.GridLayout;
// 导入ImageView类，用于显示图像 
import android.widget.ImageView;
// 导入Toast类，用于在屏幕上显示短暂的提示信息 
import android.widget.Toast;

// 导入项目资源类R，用于引用项目中的资源（如布局、字符串等） 
import com.example.myapplication01.R;
// 导入自定义的ImageInfo类，用于存储图片的相关信息 
import com.example.myapplication01.chapter08.enity.ImageInfo;
// 导入自定义的FileUtil类，用于处理文件相关的操作 
import com.example.myapplication01.chapter08.util.FileUtil;
// 导入自定义的PermissionUtil类，用于处理权限相关的操作 
import com.example.myapplication01.chapter08.util.PermissionUtil;
// 导入自定义的Utils类，包含一些通用的工具方法 
import com.example.myapplication01.chapter08.util.Utils;

// 导入File类，用于表示文件或目录 
import java.io.File;
// 导入ArrayList类，用于创建动态数组 
import java.util.ArrayList;
// 导入List接口，是集合框架的一部分 
import java.util.List;

// 定义ProviderMmsActivity类，继承自AppCompatActivity 
public class ProviderMmsActivity extends AppCompatActivity {
    // 定义需要请求的权限数组，这里只请求读取外部存储的权限 
    private static final String[] PERMISSIONS = new String[]{
            Manifest.permission.READ_EXTERNAL_STORAGE
    };
    // 定义权限请求的请求码，用于在权限请求回调中识别请求 
    private static final int PERMISSION_REQUEST_CODE = 1;
    // 定义一个ImageInfo类型的列表，用于存储图片信息 
    private List<ImageInfo> mImageList = new ArrayList<>();
    // 定义一个GridLayout对象，用于显示图片网格 
    private GridLayout gl_appendix;
    // 定义一个EditText对象，用于输入电话号码 
    private EditText et_phone;
    // 定义一个EditText对象，用于输入彩信标题 
    private EditText et_title;
    // 定义一个EditText对象，用于输入彩信内容 
    private EditText et_message;

    // Activity的生命周期方法，在Activity创建时调用 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // 调用父类的onCreate方法 
        super.onCreate(savedInstanceState);
        // 设置Activity的布局为activity_provider_mms.xml  
        setContentView(R.layout.activity_provider_mms);
        // 通过id查找EditText控件，用于输入电话号码 
        et_phone = findViewById(R.id.et_phone);
        // 通过id查找EditText控件，用于输入彩信标题 
        et_title = findViewById(R.id.et_title);
        // 通过id查找EditText控件，用于输入彩信内容 
        et_message = findViewById(R.id.et_message);
        // 通过id查找GridLayout控件，用于显示图片网格 
        gl_appendix = findViewById(R.id.gl_appendix);

        // 手动让MediaStore扫描指定目录下的文件并入库 
        MediaScannerConnection.scanFile(this,
                new String[]{Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString()},
                null, null);

        // 检查是否已经获得所需的权限 
        if (PermissionUtil.checkPermission(this,  PERMISSIONS, PERMISSION_REQUEST_CODE)) {
            // 如果权限已获得，加载图片列表 
            loadImageList();
            // 显示图片网格 
            showImageGrid();
        }
    }

    // 权限请求结果的回调方法 
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        // 调用父类的onRequestPermissionsResult方法 
        super.onRequestPermissionsResult(requestCode,  permissions, grantResults);
        // 检查请求码是否匹配，并且权限是否被授予 
        if (requestCode == PERMISSION_REQUEST_CODE &&
                PermissionUtil.checkGrant(grantResults))  {
            // 如果权限被授予，加载图片列表 
            loadImageList();
            // 显示图片网格 
            showImageGrid();
        }
    }

    // 显示图片网格的方法 
    private void showImageGrid() {
        // 清除GridLayout中的所有子视图 
        gl_appendix.removeAllViews();
        // 遍历图片信息列表 
        for (ImageInfo image : mImageList) {
            // 创建一个ImageView对象，用于显示图片 
            ImageView iv_appendix = new ImageView(this);
            // 从文件路径中解码出Bitmap对象 
            Bitmap bitmap = BitmapFactory.decodeFile(image.path);
            // 将Bitmap对象设置到ImageView中显示 
            iv_appendix.setImageBitmap(bitmap);
            // 设置ImageView的缩放类型为居中适配 
            iv_appendix.setScaleType(ImageView.ScaleType.FIT_CENTER);
            // 将dp值转换为px值，设置ImageView的宽度和高度 
            int px = Utils.dip2px(this,  110);
            // 创建布局参数对象 
            ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(px, px);
            // 将布局参数应用到ImageView上 
            iv_appendix.setLayoutParams(params);
            // 将dp值转换为px值，设置ImageView的内边距 
            int padding = Utils.dip2px(this,  5);
            iv_appendix.setPadding(padding,  padding, padding, padding);
            // 为ImageView设置点击事件监听器 
            iv_appendix.setOnClickListener(v  -> {
                // 当ImageView被点击时，调用sendMms方法发送彩信 
                sendMms(et_phone.getText().toString(),
                        et_title.getText().toString(),
                        et_message.getText().toString(),
                        image.path);
            });
            // 将ImageView添加到GridLayout中 
            gl_appendix.addView(iv_appendix);
        }
    }

    // 加载图片列表的方法 
    @SuppressLint("Range")
    private void loadImageList() {
        // 定义要查询的列名数组 
        String[] columns = new String[]{
                MediaStore.Images.Media._ID, // 图片的编号 
                MediaStore.Images.Media.TITLE, // 图片的标题 
                MediaStore.Images.Media.SIZE, // 图片的文件大小 
                MediaStore.Images.Media.DATA, // 图片的文件路径 
        };
        // 查询外部存储中的图片，筛选出文件大小小于300KB的图片，并按文件大小降序排列 
        Cursor cursor = getContentResolver().query(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                columns,
                "_size < 307200",
                null,
                "_size DESC"
        );
        // 记录已加载的图片数量 
        int count = 0;
        // 检查游标是否不为空 
        if (cursor != null) {
            // 遍历游标，直到游标的末尾或者已加载6张图片 
            while (cursor.moveToNext()  && count < 6) {
                // 创建一个ImageInfo对象，用于存储图片信息 
                ImageInfo image = new ImageInfo();
                // 从游标中获取图片的编号 
                image.id  = cursor.getLong(cursor.getColumnIndex(MediaStore.Images.Media._ID));
                // 从游标中获取图片的标题 
                image.name  = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.TITLE));
                // 从游标中获取图片的文件大小 
                image.size  = cursor.getLong(cursor.getColumnIndex(MediaStore.Images.Media.SIZE));
                // 从游标中获取图片的文件路径 
                image.path  = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
                // 检查文件路径是否有效 
                if (FileUtil.checkFileUri(this,  image.path))  {
                    // 如果文件路径有效，图片数量加1 
                    count++;
                    // 将图片信息添加到图片列表中 
                    mImageList.add(image);
                }
                // 输出图片信息到日志 
                Log.d("ning", "image:" + image.toString());
            }
        }
    }

    // 发送带图片的彩信的方法 
    private void sendMms(String phone, String title, String message, String path) {
        // 根据指定路径创建一个Uri对象 
        Uri uri = Uri.parse(path);
        // 检查Android系统版本是否大于等于7.0 
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            // 如果是Android 7.0及以上版本，使用FileProvider获取文件的Uri 
            uri = FileProvider.getUriForFile(this,  getString(R.string.file_provider),  new File(path));
            // 输出新的Uri到日志 
            Log.d("ning", String.format("new  uri:%s", uri.toString()));
        }
        // 创建一个Intent对象，用于启动发送彩信的操作 
        Intent intent = new Intent(Intent.ACTION_SEND);
        // 设置Intent的标志，启动一个新的任务 
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        // 设置Intent的标志，允许接收者读取Intent携带的Uri数据 
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        // 设置彩信的目标电话号码 
        intent.putExtra("address",  phone);
        // 设置彩信的标题 
        intent.putExtra("subject",  title);
        // 设置彩信的内容 
        intent.putExtra("sms_body",  message);
        // 设置彩信的图片附件 
        intent.putExtra(Intent.EXTRA_STREAM,  uri);
        // 设置Intent的类型为图片 
        intent.setType("image/*");
        // 启动Intent，系统会弹出选择窗口，让用户选择发送彩信的应用 
        startActivity(intent);
        // 显示一个短暂的提示信息，提示用户选择短信或信息应用 
        Toast.makeText(this,  "请在弹窗中选择短信或者信息应用", Toast.LENGTH_SHORT).show();
    }
} 